template <class C> inline bool is_corner_12(const byte* p, const int w, const int barrier) {
    const int w3 = 3*w;
    const int t = C::prep_t(*p, barrier);
    if (!C::eval(p[-w3],t)) { // -???????????????
        if (!C::eval(p[-3],t)) { // -???????????-???
            return false;
        } // -???????????@???
        if (!C::eval(p[3],t)) { // -???-???????@???
            return false;
        } // -???@???????@???
        if (!C::eval(p[3+w],t)) { // -???@-??????@???
            return false;
        } // -???@@??????@???
        if (!C::eval(p[-3+w],t)) { // -???@@?????-@???
            return false;
        } // -???@@?????@@???
        if (!C::eval(p[-2+2*w],t)) { // -???@@????-@@???
            return false;
        } // -???@@????@@@???
        if (!C::eval(p[-1+w3],t)) { // -???@@???-@@@???
            return false;
        } // -???@@???@@@@???
        if (!C::eval(p[2+2*w],t)) { // -???@@-??@@@@???
            return false;
        } // -???@@@??@@@@???
        if (!C::eval(p[w3],t)) { // -???@@@?-@@@@???
            return false;
        } // -???@@@?@@@@@???
        if (!C::eval(p[1+w3],t)) { // -???@@@-@@@@@???
            return false;
        } // -???@@@@@@@@@???
        if (!C::eval(p[-3-w],t)) { // -???@@@@@@@@@-??
            if (!C::eval(p[1-w3],t)) { // --??@@@@@@@@@-??
                return false;
            } // -@??@@@@@@@@@-??
            if (!C::eval(p[2-2*w],t)) { // -@-?@@@@@@@@@-??
                return false;
            } // -@@?@@@@@@@@@-??
            if (!C::eval(p[3-w],t)) { // -@@-@@@@@@@@@-??
                return false;
            } // -@@@@@@@@@@@@-??
            return true;
        } // -???@@@@@@@@@@??
        if (!C::eval(p[-2-2*w],t)) { // -???@@@@@@@@@@-?
            if (!C::eval(p[2-2*w],t)) { // -?-?@@@@@@@@@@-?
                return false;
            } // -?@?@@@@@@@@@@-?
            if (!C::eval(p[3-w],t)) { // -?@-@@@@@@@@@@-?
                return false;
            } // -?@@@@@@@@@@@@-?
            return true;
        } // -???@@@@@@@@@@@?
        if (!C::eval(p[3-w],t)) { // -??-@@@@@@@@@@@?
            if (!C::eval(p[-1-w3],t)) { // -??-@@@@@@@@@@@-
                return false;
            } // -??-@@@@@@@@@@@@
            return true;
        } // -??@@@@@@@@@@@@?
        return true;
    } // @???????????????
    if (!C::eval(p[-1-w3],t)) { // @??????????????-
        if (!C::eval(p[3-w],t)) { // @??-???????????-
            return false;
        } // @??@???????????-
        if (!C::eval(p[-3+w],t)) { // @??@???????-???-
            return false;
        } // @??@???????@???-
        if (!C::eval(p[-2+2*w],t)) { // @??@??????-@???-
            return false;
        } // @??@??????@@???-
        if (!C::eval(p[-1+w3],t)) { // @??@?????-@@???-
            return false;
        } // @??@?????@@@???-
        if (!C::eval(p[w3],t)) { // @??@????-@@@???-
            return false;
        } // @??@????@@@@???-
        if (!C::eval(p[3],t)) { // @??@-???@@@@???-
            return false;
        } // @??@@???@@@@???-
        if (!C::eval(p[1+w3],t)) { // @??@@??-@@@@???-
            return false;
        } // @??@@??@@@@@???-
        if (!C::eval(p[2+2*w],t)) { // @??@@?-@@@@@???-
            return false;
        } // @??@@?@@@@@@???-
        if (!C::eval(p[3+w],t)) { // @??@@-@@@@@@???-
            return false;
        } // @??@@@@@@@@@???-
        if (!C::eval(p[2-2*w],t)) { // @?-@@@@@@@@@???-
            if (!C::eval(p[-3],t)) { // @?-@@@@@@@@@-??-
                return false;
            } // @?-@@@@@@@@@@??-
            if (!C::eval(p[-3-w],t)) { // @?-@@@@@@@@@@-?-
                return false;
            } // @?-@@@@@@@@@@@?-
            if (!C::eval(p[-2-2*w],t)) { // @?-@@@@@@@@@@@--
                return false;
            } // @?-@@@@@@@@@@@@-
            return true;
        } // @?@@@@@@@@@@???-
        if (!C::eval(p[1-w3],t)) { // @-@@@@@@@@@@???-
            if (!C::eval(p[-3],t)) { // @-@@@@@@@@@@-??-
                return false;
            } // @-@@@@@@@@@@@??-
            if (!C::eval(p[-3-w],t)) { // @-@@@@@@@@@@@-?-
                return false;
            } // @-@@@@@@@@@@@@?-
            return true;
        } // @@@@@@@@@@@@???-
        return true;
    } // @??????????????@
    if (!C::eval(p[1-w3],t)) { // @-?????????????@
        if (!C::eval(p[3+w],t)) { // @-???-?????????@
            return false;
        } // @-???@?????????@
        if (!C::eval(p[-3-w],t)) { // @-???@???????-?@
            return false;
        } // @-???@???????@?@
        if (!C::eval(p[-3],t)) { // @-???@??????-@?@
            return false;
        } // @-???@??????@@?@
        if (!C::eval(p[-3+w],t)) { // @-???@?????-@@?@
            return false;
        } // @-???@?????@@@?@
        if (!C::eval(p[-2+2*w],t)) { // @-???@????-@@@?@
            return false;
        } // @-???@????@@@@?@
        if (!C::eval(p[2+2*w],t)) { // @-???@-???@@@@?@
            return false;
        } // @-???@@???@@@@?@
        if (!C::eval(p[1+w3],t)) { // @-???@@-??@@@@?@
            return false;
        } // @-???@@@??@@@@?@
        if (!C::eval(p[-1+w3],t)) { // @-???@@@?-@@@@?@
            return false;
        } // @-???@@@?@@@@@?@
        if (!C::eval(p[w3],t)) { // @-???@@@-@@@@@?@
            return false;
        } // @-???@@@@@@@@@?@
        if (!C::eval(p[-2-2*w],t)) { // @-???@@@@@@@@@-@
            if (!C::eval(p[2-2*w],t)) { // @--??@@@@@@@@@-@
                return false;
            } // @-@??@@@@@@@@@-@
            if (!C::eval(p[3-w],t)) { // @-@-?@@@@@@@@@-@
                return false;
            } // @-@@?@@@@@@@@@-@
            if (!C::eval(p[3],t)) { // @-@@-@@@@@@@@@-@
                return false;
            } // @-@@@@@@@@@@@@-@
            return true;
        } // @-???@@@@@@@@@@@
        return true;
    } // @@?????????????@
    if (!C::eval(p[2-2*w],t)) { // @@-????????????@
        if (!C::eval(p[2+2*w],t)) { // @@-???-????????@
            return false;
        } // @@-???@????????@
        if (!C::eval(p[1+w3],t)) { // @@-???@-???????@
            return false;
        } // @@-???@@???????@
        if (!C::eval(p[-2-2*w],t)) { // @@-???@@??????-@
            return false;
        } // @@-???@@??????@@
        if (!C::eval(p[w3],t)) { // @@-???@@-?????@@
            return false;
        } // @@-???@@@?????@@
        if (!C::eval(p[-3-w],t)) { // @@-???@@@????-@@
            return false;
        } // @@-???@@@????@@@
        if (!C::eval(p[-3],t)) { // @@-???@@@???-@@@
            return false;
        } // @@-???@@@???@@@@
        if (!C::eval(p[-1+w3],t)) { // @@-???@@@-??@@@@
            return false;
        } // @@-???@@@@??@@@@
        if (!C::eval(p[-2+2*w],t)) { // @@-???@@@@-?@@@@
            return false;
        } // @@-???@@@@@?@@@@
        if (!C::eval(p[-3+w],t)) { // @@-???@@@@@-@@@@
            return false;
        } // @@-???@@@@@@@@@@
        return true;
    } // @@@????????????@
    if (!C::eval(p[-2-2*w],t)) { // @@@???????????-@
        if (!C::eval(p[3-w],t)) { // @@@-??????????-@
            return false;
        } // @@@@??????????-@
        if (!C::eval(p[-2+2*w],t)) { // @@@@??????-???-@
            return false;
        } // @@@@??????@???-@
        if (!C::eval(p[3],t)) { // @@@@-?????@???-@
            return false;
        } // @@@@@?????@???-@
        if (!C::eval(p[-1+w3],t)) { // @@@@@????-@???-@
            return false;
        } // @@@@@????@@???-@
        if (!C::eval(p[w3],t)) { // @@@@@???-@@???-@
            return false;
        } // @@@@@???@@@???-@
        if (!C::eval(p[3+w],t)) { // @@@@@-??@@@???-@
            return false;
        } // @@@@@@??@@@???-@
        if (!C::eval(p[2+2*w],t)) { // @@@@@@-?@@@???-@
            return false;
        } // @@@@@@@?@@@???-@
        if (!C::eval(p[1+w3],t)) { // @@@@@@@-@@@???-@
            return false;
        } // @@@@@@@@@@@???-@
        return true;
    } // @@@???????????@@
    if (!C::eval(p[3-w],t)) { // @@@-??????????@@
        if (!C::eval(p[-3-w],t)) { // @@@-?????????-@@
            return false;
        } // @@@-?????????@@@
        if (!C::eval(p[1+w3],t)) { // @@@-???-?????@@@
            return false;
        } // @@@-???@?????@@@
        if (!C::eval(p[-3],t)) { // @@@-???@????-@@@
            return false;
        } // @@@-???@????@@@@
        if (!C::eval(p[-3+w],t)) { // @@@-???@???-@@@@
            return false;
        } // @@@-???@???@@@@@
        if (!C::eval(p[w3],t)) { // @@@-???@-??@@@@@
            return false;
        } // @@@-???@@??@@@@@
        if (!C::eval(p[-1+w3],t)) { // @@@-???@@-?@@@@@
            return false;
        } // @@@-???@@@?@@@@@
        if (!C::eval(p[-2+2*w],t)) { // @@@-???@@@-@@@@@
            return false;
        } // @@@-???@@@@@@@@@
        return true;
    } // @@@@??????????@@
    if (!C::eval(p[3],t)) { // @@@@-?????????@@
        if (!C::eval(p[w3],t)) { // @@@@-???-?????@@
            return false;
        } // @@@@-???@?????@@
        if (!C::eval(p[-3-w],t)) { // @@@@-???@????-@@
            return false;
        } // @@@@-???@????@@@
        if (!C::eval(p[-3],t)) { // @@@@-???@???-@@@
            return false;
        } // @@@@-???@???@@@@
        if (!C::eval(p[-1+w3],t)) { // @@@@-???@-??@@@@
            return false;
        } // @@@@-???@@??@@@@
        if (!C::eval(p[-2+2*w],t)) { // @@@@-???@@-?@@@@
            return false;
        } // @@@@-???@@@?@@@@
        if (!C::eval(p[-3+w],t)) { // @@@@-???@@@-@@@@
            return false;
        } // @@@@-???@@@@@@@@
        return true;
    } // @@@@@?????????@@
    if (!C::eval(p[-3-w],t)) { // @@@@@????????-@@
        if (!C::eval(p[-1+w3],t)) { // @@@@@????-???-@@
            return false;
        } // @@@@@????@???-@@
        if (!C::eval(p[w3],t)) { // @@@@@???-@???-@@
            return false;
        } // @@@@@???@@???-@@
        if (!C::eval(p[3+w],t)) { // @@@@@-??@@???-@@
            return false;
        } // @@@@@@??@@???-@@
        if (!C::eval(p[2+2*w],t)) { // @@@@@@-?@@???-@@
            return false;
        } // @@@@@@@?@@???-@@
        if (!C::eval(p[1+w3],t)) { // @@@@@@@-@@???-@@
            return false;
        } // @@@@@@@@@@???-@@
        return true;
    } // @@@@@????????@@@
    if (!C::eval(p[3+w],t)) { // @@@@@-???????@@@
        if (!C::eval(p[-3],t)) { // @@@@@-??????-@@@
            return false;
        } // @@@@@-??????@@@@
        if (!C::eval(p[-1+w3],t)) { // @@@@@-???-??@@@@
            return false;
        } // @@@@@-???@??@@@@
        if (!C::eval(p[-2+2*w],t)) { // @@@@@-???@-?@@@@
            return false;
        } // @@@@@-???@@?@@@@
        if (!C::eval(p[-3+w],t)) { // @@@@@-???@@-@@@@
            return false;
        } // @@@@@-???@@@@@@@
        return true;
    } // @@@@@@???????@@@
    if (!C::eval(p[2+2*w],t)) { // @@@@@@-??????@@@
        if (!C::eval(p[-2+2*w],t)) { // @@@@@@-???-??@@@
            return false;
        } // @@@@@@-???@??@@@
        if (!C::eval(p[-3+w],t)) { // @@@@@@-???@-?@@@
            return false;
        } // @@@@@@-???@@?@@@
        if (!C::eval(p[-3],t)) { // @@@@@@-???@@-@@@
            return false;
        } // @@@@@@-???@@@@@@
        return true;
    } // @@@@@@@??????@@@
    if (!C::eval(p[1+w3],t)) { // @@@@@@@-?????@@@
        if (!C::eval(p[-3+w],t)) { // @@@@@@@-???-?@@@
            return false;
        } // @@@@@@@-???@?@@@
        if (!C::eval(p[-3],t)) { // @@@@@@@-???@-@@@
            return false;
        } // @@@@@@@-???@@@@@
        return true;
    } // @@@@@@@@?????@@@
    if (!C::eval(p[-3],t)) { // @@@@@@@@????-@@@
        if (!C::eval(p[w3],t)) { // @@@@@@@@-???-@@@
            return false;
        } // @@@@@@@@@???-@@@
        return true;
    } // @@@@@@@@????@@@@
    return true;
}

